home *** CD-ROM | disk | FTP | other *** search
/ Aminet 41 / Aminet 41 (2001)(Schatztruhe)[!][Feb 2001].iso / Aminet / misc / sci / Denise4_2.lha / Denise4_2 / source / main.c
Text File  |  2000-11-04  |  49KB  |  1,331 lines

  1. /*
  2.                                 Denise-MYTH Artificial Intelligence.
  3.  
  4.                                   Copyright (C) 2000 Szymon Jessa
  5.  
  6.                                          WERSJA ANGIELSKA:
  7.  
  8. This  program  is free software; you can redistribute it and/or modify it under the terms of the GNU
  9. General  Public  License  as  published  by  the  Free  Software Foundation; either version 2 of the
  10. License, or (at your option) any later version.
  11.  
  12. This  program  is  distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
  13. even  the  implied  warranty  of  MERCHANTABILITY  or  FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. General Public License for more details.
  15.  
  16. You  should  have received a copy of the GNU General Public License along with this program; if not,
  17. write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  
  19.                                            WERSJA POLSKA:
  20.  
  21. Niniejszy   program   jest  oprogramowaniem  wolnodostëpnym;  moûesz  go  rozprowadzaê  dalej  i/lub
  22. modyfikowaê na warunkach Powszechnej Licencji Publicznej GNU, wydanej przez Fundacjë Wolnodostëpnego
  23. Oprogramowania - wedîug wersji 2-giej tej Licencji lub którejô z póúniejszych wersji.
  24.  
  25. Niniejszy   program  rozpowszechniany  jest  z  nadziejâ,  iû  bëdzie  on  uûyteczny  -  jednak  BEZ
  26. JAKIEJKOLWIEK  GWARANCJI,  nawet  domyôlnej  gwarancji  PRZYDATNOÔCI  HANDLOWEJ albo PRZYDATNOÔCI DO
  27. OKREÔLONYCH ZASTOSOWAÏ. W celu uzyskania bliûszych informacji - Powszechna Licencja Publiczna GNU.
  28.  
  29. Z  pewnoôciâ  wraz  z niniejszym programem otrzymaîeô teû egzemplarz Powszechnej Licencji Publicznej
  30. GNU; jeôli nie - napisz do Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  31.  
  32.                                               KONTAKT:
  33.  
  34. snail: Szymon Jessa, ul. Warszawska 20/6, 89-600 Chojnice,
  35. email: smoczek@ue.eti.pg.gda.pl (ew. noco@box43.gnet.pl)
  36. phone: (052) 39-707-88
  37.  
  38. ****************************************************************************************************
  39. */
  40.  
  41. // Denise-MYTH 4.2 (00.11) by Ivanhoe/Quality^PAT
  42. // 16.08.2000 -> 04.11.2000
  43.  
  44. /*
  45.                                      * * *
  46.  
  47.                                 Denise-MYTH 4.2
  48.  
  49.                  Maksymalne rozumienie przy minimalnej logice.
  50.  
  51.                                      * * *
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.        hmmm... ochota, ûeby spojrzeê na warsztat pracy? proszë bardzo...
  60.  
  61.  
  62.                                      * * *
  63.  
  64.                                 Denise-MYTH 5.0
  65.  
  66.                              INTELIGENCJA LOGICZNA
  67.                                LOGIC INTELLIGENCE
  68.  
  69.                              Inteligencja Logiczna.
  70.            Maksymalna ekstracja danych za pomocâ funkcji LOGICZNYCH.
  71.                   Rozwiâzywanie prostych problemów logicznych.
  72.  
  73.                   PLANOWANA PUBLIKACJA WERSJI 5.0: 01.07.2001.
  74.                            pierwszy lipca, 2001 roku
  75.  
  76.                                      * * *
  77.  
  78.  
  79. ulepszyc odpowiadanie na pytania: czasem lepsze sa odpowiedzi krotkie, czasem dluzsze,
  80. okreslic kiedy <- zwieksza naturalnoôê odpowiedzi Denise,
  81.  
  82. zaproponowaê komuô do zrobienia róûne bazy Elizy dla róûnych stanów emocjonalnych:
  83. NASTAWIENIE_POZYTYWNE, NASTAWIENIE_OBOJETNE, NASTAWIENIE_NEGATYWNE
  84.  
  85. KONIECZNIE zmienic baze faktow - ma byc zapis neuronowy - sieci, podobnie jak u
  86. czlowieka!
  87.  
  88. Denise-MYTH 5.0. - KOMPLETNIE PRZEPISAC PROGRAM na podstawie literatury o DUZYCH PROGRAMACH,
  89. wersja 5.0 ma mieê MUI albo GUI na Amidze, ma byê pod PC Windows, oraz pod
  90. Linux'a, ma byê multi-user i w ogóle ma byê High End - ponad 10.000 sîów w bazie,
  91. ponad 1.000 faktów ogólnych o ôwiecie, wiedza ogólna z zakresu szkoîy,
  92.  
  93. 5.0:
  94.    ogólna struktura KAÛDEGO zdania:
  95.    - treôê oryginalna, wynikowe, do wypisania, lub pobrana, oryginaî,
  96.    - treôê uproszczona, przefiltrowana od wtrâceï, czysta informacja, poprawna
  97.      gramatycznie, moûe byê po ekstrakcji, úródîo, rzeczywista informacja,
  98.    - zestaw danych fleksyjnych o zdaniu, poszczególnych wyrazach podstawowych,
  99.      w postaci ostatecznej, dla której istnieje poprawny rozbiór logiczny,
  100.      dotyczy to wszystko treôci uproszczonej!
  101.    - informacje o grupach, wyrazach dominujâcych, pierwszy etap rozbioru zdania,
  102.    - dane rozbioru logicznego zdania, operujâ na wspóîrzëdnoôci grup, i funkcjach,
  103.    - informacje o typie zdania, typie podmiotu itp.
  104.  
  105.  
  106. DOPIERO W WERSJI 5.0
  107. TEORIA EKSTRAKCJI
  108. TEORIA EXTRA - do konca wrzeônia, teoria, analiza, poprawki w programie,
  109.  
  110. NOWE: Denise o maîej logicznoôci - odpowiadanie twierdzeniami na twierdzenia,
  111. jeôli np. "czego stolicâ jest ryga?" <- nie rozumiemy zdania, ale "ryga" i
  112. "stolica" sâ w bazie faktów, wiëc moûna odpowiedzieê, ûe "ryga to stolica" <-
  113. chociaû tyle!!!
  114.  
  115. TERAZ: spacjalny moduî zamiany imienia Denise na jakiekolwiek inne, np. change name
  116. "sylwia" - od tej pory WSZËDZIE w programie denise jest sylwiâ, ale w bazie
  117. zapis jest jako "denise" (zmiany w bazie Elizy, odmianie i w ogóle WSZËDZIE)
  118.  
  119.  
  120. teoria:
  121.  
  122. ...
  123.  
  124. - ma byê jak najbardziej ogólna: ma akceptowaê TAK SAMO odpowiedzi do wypowiedzi
  125.   Denise jak równieû Elizy,
  126. - nie definiuje ûadnych dodatkowych zmiennych globalnych,
  127. - funkcja ma dziaîaê w nowy sposób:
  128.    - podaje sië po prostu dwa parametry:
  129.       - zdanie pierwsze, (jako zdanie DENISE)
  130.       - zdanie drugie, bëdâce odpowiedziâ na pierwsze, (jako zdanie ROZMÓWCY)
  131.    - funkcja zwraca jeden parametr:
  132.       - zdanie drugie ewentualnie przeksztaîcone zgodnie z zasadami ekstrakcji,
  133.  
  134.  algorytm dziaîania funkcji:
  135.  
  136.  // funkcja typu BETA - uproszczona, dostosowana do konstrukcji 4.2
  137.  
  138.  void extra_main(char *question_orig,char *answer_orig,char *result_orig);
  139.  - question_orig, answer_orig - dowolne zdania, w formie naturalnej,
  140.  - przetransformowanie zdaï na postaê podstawowâ, przefiltrowanâ od wtrâceï,
  141.  - 
  142.  
  143.  
  144.  - pobranie fleksji wszystkich wyrazów
  145.  - okreôlenie typu odpowiedzi i pytania,
  146.  - odpowiednie modyfikacje,
  147.  
  148.  
  149. BARDZO WAZNE: zmieniê wnioskowanie dziedziczone na jakâô profesionalnâ funkcjë!
  150. a teraz to jest czysta chaîa!
  151.  
  152.  
  153. SUPER EKSTRAKCJA: zaimki!!!! jesteô miîy? TAKI jestem -> jestem miîy itp.
  154.  
  155. ...
  156.  
  157. - po fleksji i przed skîadniâ,
  158. - pytanie i odpowiedú - nie koniecznie muszâ to byê faktyczne pytania i odpowiedzi!
  159. - przypadki:
  160.    - odpowiedú nie zawiera czasownika, (np. "czîowiekiem", "miîâ osobâ", "tak", "nie"),
  161.       - pytanie byîo ogólne ("kim jesteô?")
  162.          - WARUNKI STOSOWALNOÔCI:
  163.             - zgodnoôê zaimka z podanym wyrazem,
  164.             - zgodnoôê osób: pyt. TY -> odp. JA, pyt. JA -> odp. TY, pyt. ON -> odp. ON
  165.          - ewentualna zamiana osoby czasownika (ty->ja, ja->ty, on->on),
  166.          - wstawienie w miejsce zaimka odpowiedzi (w odpowiednim miejscu),
  167.          - odmiana zdania,
  168.          - ANALIZA LOGICZNA,
  169.       - pytanie byîo szczegóîowe ("jesteô czîowiekiem?")
  170.          - WARUNKI STOSOWALNOÔCI:
  171.             - akceptowalne sâ jedynie odpowiedzi potwierdzajâce lub zaprzeczajâce:
  172.               "tak", "nie", "to prawda", "to nie jest prawda" itp.
  173.          - ewentualna zamiana osoby czasownika,
  174.          - ewentualne modyfikacje z przeczeniem "nie",
  175.          - odmiana zdania,
  176.          - ANALIZA LOGICZNA,
  177.    - odpowiedú zawiera czasownik (np. "mam", "nie jestem"),
  178.       - WARUNKI STOSOWALNOÔCI:
  179.          - 
  180.       - czasownik odpowiedzi i pytania sâ zgodne:
  181.          "czy masz samochód?" -> "nie mam"
  182.       - czasownik odpowiedzi i pytania sâ róûne:
  183.          - BRAK EKSTRAKCJI - nieporozumienie, albo nowy temat, nie istotne teraz,
  184.  
  185. * - ûeby rozmawiajâce ze sobâ Denise korzystaîy z MYTH a nie tylko Elizy
  186.  
  187. TERAZ: analiza budowy moduîowej, tj. tak jak simplerexx - doîâczaê tylko przy
  188. linkowaniu, bez kompilacji wszystkich includów, zrobiê w ten sposób wszystkie
  189. includy jako osobne podprogramy z niektórymi funkcjami wywoîywanymi z zewnâtrz -
  190. umoûliwi to kompilacjë pod pc dos, i bëdzie duuuûo szybciej i profesjonalniej,
  191. - stwierdzenia zamiast pytaï: np. "tak jak Zosia",
  192. - rozumienie zdaï zîoûonych (poprzez dzielenie na zdania pojedyncze)
  193. - kto jest studentkâ? albrecht to student <- nie rozpoznaje rodzajów!!!
  194. - zwracanie uwagi, czy rozmówca mówi na temat, czy nie mówi bez sensu
  195. - pytasz BO jesteô ciekawa???????
  196. - problemy logiczne, proste twierdzenia matematyczne, przeprowadzanie dowodów,
  197. wykonywanie róûnych operacji róûnymi narzëdziami, np. podaje sië denise
  198. narzëdzia i mówi, co mogâ zrobiê, i pyta sië, czy moûna coô zrobiê, a ona
  199. sprawdza, czy jest to moûliwe na podstawie tego co ma w bazie - tj. czy
  200. informacje podane w bazie pozwalajâ wytworzyê zadanâ informacjë - kaûda operacja
  201. jest informacjâ, np. "podnieô klocek" -> czy moûna sprawiê, aby prawdziwa
  202. informacja byîa: "podniosîam klocek", czy "mogë podnieôê klocek" - realizacja
  203. mogîaby byê programowo-sprzëtowa!!!!
  204. - LOGIKA - czy zapis logiczny ma byê od razu z zapisem zdania, tj. "darek jest
  205. uczniem andrzeja" i zapis: "andrzej ma ucznia darka", czy ma byc
  206. wywnioskowywany na bierzaco?
  207.  
  208. TERAZ: a moûe byê b
  209. TERAZ: sortowanie bazy faktów alfabetycznie, bëdzie duûo szybsze wyszukiwanie faktów
  210. w bazie, mother fakt itp.
  211.  
  212. - NOWA GRAMATYKA - patrzeê do materiaîów na pececie, z pîytki, orzeczenia
  213. zîoûone
  214. - zdania definicyjne: czytam BO lubië czytaê <- jaki zapis, jaki rozbiór itp.
  215.  
  216. TERAZ: przyôpieszenie mapy korelacji poprzez jej sortowanie alfabetyczne i
  217. koïczenie, jeôli pierwsza literka jest dalsza niû szukanego wyrazu (jak we
  218. fleksji). sprawdziê, czy to przyôpiesza?
  219.  
  220. TERAZ: odmienianie w liczbie mnogiej w sâsiedztwie liczebników (dwie rëce nie REKA)
  221.  
  222. TERAZ: udoskonalenie odpowiadania na pytania ogólne: "kim jesteô?" itp. do
  223. odpowiedzi wybieramy fp, który ma najmniej faktów unknown, tj. staramy sië daê
  224. odpowiedú bëdâcâ odpowiedziâ na najwiëcej pytaï, ALE: nie dajemy zawsze tej
  225. odpowiedzi - losujemy zgodnie z prawdopodobienstwem okreôlonym poprzez liczbë
  226. fp unknown. powinno to teû zaleûeê od stosunku do rozmówcy - albo mówimy mu duûo
  227. i dobrze, albo jak najmniej.
  228. - jeôli: denise lubi ludzi; a darek jest czîowiekiem, to denise lubi darka
  229. jest to NIE WNIOSKOWANIE, ale LOGIKA:
  230. darek jest czîowiekiem
  231. denise lubi ludzi
  232. wiëc:
  233. denise lubi darka, bo darek jest czîowiekiem, a denise lubi ludzi
  234. jeôli ktoô/coô jest "ludzi" to denise traktuje go poprzez "lubiê"
  235. - ZDANIA ZÎOÛONE: podziaî w myth() lub zrobiê osobnâ funkcjë wielowywoîujâcâ
  236. - ekstrakcja informacji z bazy: co wynika z róûnych zwiâzków gramatycznych, tak
  237. jak to byîo we wnioskowaniu przydawkowym,
  238. - opis formalny róûnych zwiâzków logicznych, jest to LOGIKA nie wnioskowanie,
  239. zrobiê opis formalny, A=B itp. i wprowadziê nowy moduî LOGICZNY (kontrolowaîby
  240. zgonoôci nie-jednoznaczne bezpoôrednio)
  241. - algorytmy ôledzenia - tj. pokazywanie drogi, która doprowadziîa do sukcesu,
  242. czyli: wnioskowanie, logikë itp. w postaci normalnych zdaï
  243. - jak sie nazywasz?
  244. - NIE DZIALA: KTO ma ucznia? jeôli: darek jest uczniem andrzeja
  245. - inteligentne tworzenie odmian na podstawie wyrazu podstawowego
  246. - sprawdziê, czy jest sens robiê mapë cechowania faktów - analogicznie do
  247. korelacji, ale obejmujâcej pozostaîe czasowniki okreôlajâce
  248. - funkcja kontroli zgodnoôci z bazâ faktów dla mapy korelacji i jej kompletnoôci
  249. - czym lubi jeúdziê karol? (przy: karol lubi jeúdziê samochodem)
  250. - wprowadziê zaleûnoôci w tworzeniu pytania, m. in. od tematu ostatniego zdania (denise, rozmówca, czy temat?)
  251. - sîowa tymczasowe - których zapisy moûna weryfikowaê w bazie faktów
  252. - WAZNE: Denise na ICQ!!! Ustaliê dane personalne: polka, ale nie od urodzenia,
  253. stâd to imie,
  254. - ANSWER OGOLNE - czy wymagana ma byê 100% zgodnoôê wszystkiego? bo wtedy nie
  255. byîoby sytuacji ûe np. "jakie masz oczy?" -> "mam zielone spodnie"
  256. - MULTIUSER - moûliwoôê rozmawiamia wielu uûytkowników, jak na irc'u
  257. - nazywasz sië denise <- nie rozumie tego
  258. w ogóle zrobiê jakâô obsîugë wyrazów z "sië", ûeby byîo wiadomo co i jak
  259. - lepsze zadawanie pytaï - lepszy wybór fp - taki, ûeby automatycznie okreôliê
  260. najwiëcej pochodnych danych (wnioskowanie itp.), oraz ûeby ustaliê przynaleûnoôê
  261. do jak najmniejszej grupy podobnych faktów
  262. - TWIERDZENIA
  263. - lepszy RAND()
  264. - imiesîowy, zaimki
  265. - pokazywanie przebiegu wnioskowania
  266. - przepisaê obsîugi FAKTOW - od identyfikacji do wnioskowania!
  267. - w klasyfikacji - powinno byê okreôlanie, ûe ORZECZNIK ma byê RZECZOWNIKIEM!!!
  268. - lista podrëczna tego czym coô moûe byê, tj. faktów klasyfikacyjnych
  269. - algorytmy postëpowania:
  270.    CEL: zbieranie szczegóîowych danych z wybranego zakresu
  271.    jeôli uûytkownik nie odpowiada na pytania szczegóîowe, to pytamy o ogólne
  272. - nauka z pliku - np. plik, w którym zawarte sâ zdania, a ona je zapamiëtuje w
  273. bazie faktów, np. plik ze stolicami, plik z miastami, plik z imionami (baza
  274. fleksji, baza faktów), w ten sposób moûna by rozszerzaê bazy danych!!! LEARN
  275. FROM FILE
  276. - program powinien prowadziê uûytkownika, przejmowaê inicjatywë, domagaê sië od
  277. niego informacji!!!!
  278. - trzeba aû 2 razy uruchamiaê program, jeôli baza fleksji nie jest posortowana,
  279. ûeby sië posortowaîa przy trybie FLEKSJA_SORT. powinno byê od razu
  280. - jesteô stolicâ polska? <- powinno byê polskI
  281. - przy wyjôciu z programu nagrywa status rozmowy: ile byîo odpowiedzi Elizy ile
  282. Denise, ile wyrazów nieznanych, zdaï nielogicznych - wszystko w procentach!!!!
  283. - tylko miasta mogâ byê stolicami <- ograniczenia co moûe byê czym!
  284. - ciaîo
  285. - potraktowaê caîy projekt Denise-MYTH w obecnej fazie jako interfejs
  286. komunikacyjny i rozpoczâê konstrukcjë wîaôciwej inteligencji, nadrzëdnej do
  287. Denise i pracujâcej na zasadzie wielowâtkowego rozwiâzywacza problemów, tak jak
  288. to byîo opisane we wczeôniejszych fazach projektowania (podôwiadomoôê,
  289. ôwiadomoôê itp.) - kompletnie zmodernizowaê sposób dziaîania programu,
  290. wyodrëbniê interfejs, rozbiór zdania, fakty itp.
  291. - zupeînie zmieniê sposób dziaîania programu: funkcje ogólne zwracajâce
  292. strukturë np. rozbioru itp. bez zmiennych globalnych, tylko funkcje - nowy
  293. sposób kompilacji - jakieô moduîy, PRAWDZIWE includy,
  294. - dodanie jakoôciowej analizy skîadniowej, tj. np. jeôli jakiô wyraz nie zostaî
  295. poprawnie odczytany, ale reszta sië zgadza, to zdanie zostaje zapisane w bazie z
  296. jakimô prawdopodobienstwem, a zdania z malym prawdopodobienstwem wymagaja, aby
  297. zostaly potwierdzone przez rozmowce!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  298. - nowa analiza faktów - wnioskowanie sâsiadujâce, tj. jeôli ktoô jest
  299. szczëôliwym czîowiekiem, to na xx% sam jest szczëôliwy w ogóle
  300. - zastanowiê sië nad wieloplikowâ bazâ faktów - moûe jakiô podziaî? albo nauka z
  301. plików standardowych - np. stolice krajów,
  302. - opcja wyjaôniajâca wnioskowanie dla jednego poziomu wgîâb, tj.:
  303. jestem czîowiekiem
  304. czîowiek ma rëce
  305. czy mam rëce?
  306. -> masz rëce, bo jesteô czîowiekiem
  307.    kaûdy czîowiek ma rëce
  308.    jesteô czîowiekiem, wiëc masz rëce
  309. - specjalny tor komunikacyjny z Elizy do Denise, tj. w elizie naleûy dodaê opcjë
  310. $ODPOWIEDZ("denise kim jesteô") na pytania typu: "opowiedz coô o sobie" itp.
  311. - port komunikacyjny w formie pliku - pozwala m. in. na komunikacjë innych
  312. programów, np. program obsîugujâcy mowë, tîumaczy jâ na formë tekstowâ, a
  313. informacjë të przekazuje po prostu Denise dogrywajâc jâ w pliku; Denise pobiera
  314. jâ i zaleûnie od typu (np. zwykîa rozmowa) moûe wyôwietliê na ekranie, przyjâê
  315. zupeînie jak normalnie wprowadzony tekst, czyli równieû np. wykonaê odpowiedni
  316. rozkaz (na sygnaî MOWY!!!),
  317. - zrozumieê o co chodzi z typami static, extern, __far
  318. - naturalizacja wypowiedzi Denise-MYTH
  319. - okreôlanie trwaîoôci wyrazów, tj. np. elementy, które sâ ZAWSZE prawdziwe, i
  320. te, które moûna zmieniê w kaûdej chwili. np. jak ktoô sië czuje:
  321.  jestem zmëczony, po chwili moûe powiedzieê:
  322.  nie jestem zmëczony
  323.    wtedy jest sprawdzane, czy wyraz zmëczony jest wyrazem trwaîym, czy nie,
  324. jeôli nie jest trwaîym, to DENISE_ZMIANA_CECHY_TYMCZASOWEJ i zmiana danych w
  325. bazie
  326. - rozpoznawanie trybu zdania - ROZKAZUJACE, OZNAJMUJACE, PRZYPUSZCZAJACE ***
  327. - zrobiê zapis faktow - nie zamienia "ciebie" (ty) na "denise" a ma zamieniaê
  328. - uruchamianie programów zewnëtrznych poprzez funkcjë KOJARZENIA, tj.:
  329.    skojarz program <nazwa_programu> z nazwâ blablabla
  330.    ma byê na 100% w jakiejô prostej chociaû formie, ale wywoîywanie programów
  331.    i ew. zwracanie tego, co wypisujâ na okno Denise, np.:
  332.    wykonaj "echo 'abc'" ma zwróciê:
  333.    program "echo" zwróciî: abc
  334. - odpornoôê na idiotyzmy, typu zdania jednoliterkowe, itp.
  335. - celowoôê pytaï,
  336. - sympatia do róûnych osób,
  337. - ocenianie tematów jako interesujâce lub nie,
  338. - o czym z kim rozmawiaê - z rolnikiem o rolnictwie, ze studentem o szkole itp.
  339. - wiëksza elastycznoôê w pisaniu zmiennych wewnëtrznych, np. bez nawiasów, a
  340. koniec rozpoznawany przez odstëp, koniec wyrazu, maîâ literkë itp.
  341. - naturalizacja pytaï Denise - np. "powiedz mi bez_imienia, czy jesteô czîowiekiem?"
  342. tj. dodawanie fragmentów naturalizacji w pytaniach MYTH
  343. - informacje statystyczne o tym ile razy zdanie wypisywaîa Eliza, a ile razy
  344. Denise, oraz ile razy Denis wykorzystywaîa Elizë do tîumaczenia komentarzy
  345. - ulepszyê sposób zadawania pytaï MYTH
  346. - ustaliê limit, przy którym nie jest wykorzystywana ELIZA, tj. na zdania
  347. zbyt gîupie nie ma sensu odpowiadaê, np. literówki itp.: cszeôê! <- np.
  348. poniûej quality 50% nic nie robimy, lub korzystamy z jakiejô przystawki
  349. mechanicznej, typu: mówisz zupeînie bezîadnie! itp.
  350. - UWAGA! BRAK KONTROLI SKLADNI ZMIENNYCH WEWNETRZNYCH!!! <- zrobiê
  351. - wyrazy tymczasowe, itp. np. uczucia, w bazie faktów?
  352. - blisko_cmp jest bardzo wolne - powinna byê jakaô opcja przyôpieszajâca,
  353. wyîâczajâca poszukiwanie wyrazów podstawowych w systemie elizy, zastanowic
  354. sie co to wlasciwie daje?
  355. - faworyzowanie ustawieï podstawowych odmiany w odmiana.cpp!!!
  356. - uruchamianie trybu DENISE w róûnych momentach, np. przy tworzeniu
  357. pytania, w odpowiadaniu, etc.
  358. - inny sposób wywoîywania funkcji: np. rozbierz_zdanie(tresc) i zwraca coô
  359. - w wersji pod windows nie dziaîa dodawanie wyrazów do bazy
  360. - wersja pod windows wiesza sie po "kim ty jestes?"
  361. - edytor bazy danych ELIZY
  362. - wersja na AMIGE - MUI
  363. - zrobiê wiëkszâ elastycznoôê przy inteligencji - nawet przy 100% w
  364. niektórych miejscach moûe byê np. 90%
  365. - dodanie rozumienia moûliwoôci: (nie) moûe byê
  366. - rekonstrukcja programu - inny podziaî includów, osobno wnioskowanie,
  367.    lepszy sposób organizacji kodu wnioskowania, wyrazistoôê programu,
  368.    eliminacja czëôci zagmatwanych, poprawienie bîëdów,
  369. ELIZA II:
  370.       - PYTANIE:
  371.          - format: ODPOWIEDZ{treôê pytania}
  372.          - funkcja zwraca odpowiedú typu:
  373.             - TAK (prawda) itp.
  374.             - NIE (faîsz) itp.
  375.             - jednowyrazowy element z listy w pytaniu zaimkowym
  376.          - np. ODPOWIEDZ{kto jest programistâ?} = szymon
  377.                ODPOWIEDZ{znasz szymona?} = TAK
  378.    - moûliwe jest zagnieûdûanie zmiennych, np.:
  379.      ODPOWIEDZ{lubisz $USER{P=BIERNIK}?} = TAK
  380. - odpowiadanie na pytania w trybie skróconym: "tak","nie","mam","nie mam" itp.
  381.  
  382. // nie powinna pytaê o rzeczy o znaczeniu ogólnym - powinna byê baza
  383. // definicji i baza aktywnej rzeczywistoôci
  384.  
  385. - testowanie bazy danych na dysku - i naprawianie
  386.  
  387. miîy programista pisze program
  388. programista jest miîy?
  389.  
  390. piec - moûe byê wyraz podstawowy dla czasownika jak i dla rzeczownika!
  391. konieczna dodatkowa kontrola czëôci mowy juû na poziomie odszukiwania
  392. fleksji odmiany!!!
  393.  
  394. kontrola zaimka co/kto w odpowiedzi podmiotowej (na pytanie podmiotowe)
  395.  
  396.                                    * * *
  397.  
  398. Rozwój bazy fleksji/faktów:
  399. - ogólna wiedza o ôwiecie, podstawowe obiekty, prawa,
  400. - pogaduszki, rozmowy towarzyskie,
  401.  
  402. Skîadnia.
  403. - rozumienie takich zdan: jesteô TAKA, on jest TAM - na podstawie histori rozmowy
  404.   (np. z ostatniego zdania)
  405. - tîumaczenie zaimków: masz mój adres?
  406. - zaimki
  407. - partykuîy
  408. - wykrzykniki
  409. - przymiotnik: niektóre nie stopniujâ sië!
  410. - zrobiê opcje rozbioru zdania do pierwszego sukcesu
  411. - rozbiór zdania:
  412.    - kwiat ma îadne pîatki <- ûe no co?! úle!
  413.    - masz dostëp do internetu?
  414.    - idë na trening, ale: jestem na treningu
  415.    - o czym myôlisz?
  416.    - programista pisze zielony list do kolegi
  417.    - chcesz byê mojâ dziewczynâ?
  418.    - piekarz piecze duûo chleba?
  419.    - fryzjer obcina ludziom wîosy?
  420.    - programista pisze programy palcami na klawiaturze?
  421.    - on lubi chodziê szybko? <- zîa interpretacja rozbioru logicznego
  422. - podmiot domyôlny w l. mn. ONI sâ?
  423. - liczebniki! ile masz lat?
  424. - spójnik 'i'
  425. - zapis do bazy zdania z podmiotem domyôlnym zdefiniowanym
  426. - zastanowiê sië nad znaczeniem przypadków narzucanych
  427.   czy moûe po prostu X kompletów, czy coô takiego?
  428.   bo wyraz moûe wykorzystywaê w zdaniu dwa narzucane przypadki:
  429.   programista pisze (biernik: CO?) programy (narzëdnik: CZYM?) palcami?
  430.   ? - lekarz opiekuje sië chorymi?
  431.   zastanowiê sië nad przyimkami - czy potrzebny przypadek narzucany?
  432.  
  433. Odmiana.
  434. - odmiana grup - np. w domu - gdzie jesteô?
  435.  
  436. Pytanie.
  437. - pytania o RDZEN: np. kto pisze program? albo kto jest miîy? lista do
  438.   wyboru, moze po przecinku, ze spojnikiem 'i'?
  439. - zadawanie pytaï ogólnych zaimkowych oraz odpowiadanie w tym trybie,
  440.   np.: jaki jest szymon? zielony. albo: czy jesteô kobietâ? tak, jestem kobietâ.
  441.   zeby nie byîo: informacja poprawna, sprzeczna... ble...
  442. - dodatkowe kryterium oceny tworzenia pytaï:
  443.    - jeôli pytamy o Denise (ona sië pyta o siebie), to najlepiej wychodzâ
  444.      pytania z LACZNIKAMI (jestem taka/takâ)
  445. - *7* - ANSWER.C nie sâ obsîugiwane grupy wielowyrazowe w odpowiadaniu
  446. - kiedy zadawaê pytania JA, a kiedy TY? tzw. punkt ciëûkoôci DENISE->ROZMÓWCA
  447.   jak to ustaliê? punkt zainteresowaï, O!
  448.  
  449. Odpowiedú.
  450. - uwzglëdnianie odpowiedzi typu: brak danych w pytaniu zaimkowym!
  451. - wykorzystanie umiejëtnoôci wnioskowania do odpowiadania na pytania
  452.   zaimkowe (np. jaka jesteô? czîowiek jest inteligentny - wiëc jestem
  453.   inteligentna! <- o ile w bazie nie ma zaprzeczenia of course... ;))
  454. - JAK miîa jesteô? <- w odpowiedziach uwzglëdnianie kilku FPF!!!!!
  455. - odpowiedú NIE WIEM
  456. - odpowiadanie - Czy jestem gîupia? NIE JESTEÔ. etc.
  457. - odpowiadanie naturalne - tj. czesc, czesc, witaj, etc. nie na podstawie bazy
  458.  
  459. Inne.
  460. - wyrazy bliskoznaczne
  461. - wyrazy przeciwstawne
  462. - co robisz? <- wywoîuje program, który wybiera coô - rozpoznawanie
  463.   czynnoôci wykonywanych etc.
  464. - TEORIA MAPY KORELACJI FAKTÓW
  465. - HELP: help w przypadku, gdy nie jest rozumiane zdanie (rozbiór) -
  466.   informacje o tym, co moûna zrobiê: odmiana, formuîa, zasady etc.
  467. - zeby nie nagrywal zdaï nie rozbitych gramatycznie, ze wzgledu na
  468.   nieokreslony podmiot domyslny JA
  469. - return <- w funkcjach VOID!!!!
  470. - dane o wyrazach - czy sâ trwaîe, czy tymczasowe, czy oznaczajâ stan, czy sâ
  471.   osobiste...
  472. - ZROZUMIEC CO Z TYM CALYM TYPEM S T A T I C !!!!!!
  473. - &&& - kod do uzupeînienia w grama!!!!
  474. - inny sposób zapisu w bazie faktów w przypadku podmiotu domyôlnego:
  475.   musi zostaê zindentyfikowany fakt, jeôli nie - tworzona jest baza
  476.   wirtualna? albo coô?
  477. - dodaê wspóîczynnik korelacji wszystkich faktów - sieê neuronowa
  478. - wzajemne rodziny wyrazów - tj. "czîowiek, ryba" <- gatunki, czîowiek nie
  479.   moûe byê rybâ etc.
  480. - dodaê moûliwoôê automatycznej nauki o danych pobocznych wyrazów, np.
  481.   ûywotny, nieûytowny, pospolity, przechodni itp.
  482. - zrobiê opcje modyfikacji sîowa
  483. - czîowiek moûe byê kobietâ lub mëûczyznâ <- bardzo inteligentne!
  484.   jesteô czîowiekiem, wiëc jesteô kobietâ czy mëûczyznâ?
  485. - automatyczne rozpoznawanie pewnych czëôci mowy po podaniu wyrazu
  486.   podstawowego - bo sâ te same dla caîej rodziny!!!
  487. - zrobiê moûliwoôê dodawania danych, których wczeôniej nie podano - np.
  488.   add word empty
  489.   oraz moûliwoôc zmieniania danych
  490.   albo zostawiê to na wersje okienkowâ
  491. - uwzglëdnienie czasu (sâ przecieû dane o czasie zapisu informacji! - dodaê
  492.   weryfikacjë danych! i moûliwoôê nadpisu niektórych! definiowanie parametrów
  493.   dynamicznych i statycznych - tymczasowe np. emocje)
  494. - okazywanie zainteresowania? np. Kim jesteô? A kim TY jesteô?
  495. - zastanowiê sië nad paradoksem: jestem denise -> wtedy myôli, ze nia jestem...
  496. - WADA: wszystko okreôlane 1 sîowem - potem gîëbokoôê dopiero
  497.   ZROBIÊ: jakieô multi definiowanie gîëbokie - ale jak????
  498. - fakty tymczasowe:
  499.   ROZMÓWCA - zapisujemy co mówi o sobie, a jeôli go zidentyfikujemy,
  500.   to dopisujemy od razu do bazy normalnie, jeôli powstanie rdzeï, (jaki ma
  501.   byê rdzeï?!), to do bazy
  502.   DENISE - moûe coô specjalnego dla niej?
  503.   TEMAT - to samo co rozmówca - jeôli zidentyfikujemy, to do bazy,
  504.   ostatecznie - jeôli ma rdzeï, to teû do bazy,
  505. - na pececie zwraca iloôê klonów + 100
  506. - sortowanie bazy fleksji, bo nie jest posortowana!
  507. - SUPER TEORIA: plik z danymi korelacji - tj. wspomagajâcy dobór faktów najbardziej
  508.   skorelowanych - coô jak sieê neuronowa, weryfikowana po kaûdym sprawdzeniu,
  509.   dziaîa trochë w ciemno, ale przyôpiesza, no i daje pewien element ryzyka,
  510.   ale dla bardzo duûych baz danych jest NIEZBËDNA i zapewnia szybkâ pracë - ogólnie
  511.   ma tworzyê mapë korelacji poszczególnych faktów - nie koniecznie wszystkich,
  512.   ale w procesie rozwoju powinna objâê wszystkie poruszane zagadnienia (tematy)
  513. - zrobiê obsîugë sytuacji, kiedy nie jest okreôlony PODMIOT ROZMOWCA, TEMAT, DENISE!!!
  514.   co wtedy z zapisem do bazy? jakaô virtualna?!
  515.   TAK: zapisywanie w bazie jako kod ROZMOWCA lub TEMAT - normalnie w bazie faktow
  516.   z takim rdzeniem kodowym. i za kazdym razem sprawdzanie, czy mozna przeniesc
  517.   juz rozmowce do bazy - jesli mozna, to kasujemy ten fakt i przenosimy obiekty
  518.   do bazy i zmieniamy wskaznik na ten fakt - a jak nie zidentyfikujemy, to
  519.   przy wychodzeniu z programu informujemy o bezsensownych danych i kasujemy je
  520.   z bazy -> pytanie JAK IDENTYFIKOWAC ROZMOWCE/TEMAT?????
  521. - wersja pod windows
  522. - ustaliê wypisywanie komunikatów (view.skladnia etc.)
  523. - przeczytaê 1 linie w pliku def.h i wykonaê
  524. - zadawanie pytaï szczegóîowych i ogólnych
  525. - dokoïczyê zaimki
  526. - wyrazy bliskoznaczne i przeciwstawne
  527. - uprzyzwoiciê wyglâd kodu programu (opis na poczâtku pliku, podziaîy etc.)
  528. - uwzglëdnianie czasu
  529. - uruchamianie programów
  530. - uwzglëdnianie zabarwienia wyrazów - samopoczucie, nastrój etc.
  531. - organizm (biorytmy, samopoczucie itp.)
  532. - podmiot domyôlny w peînym zakresie - temporalna baza danych nieokreôlonych
  533. - îatwiejszy sposób dodawania nowych wyrazów do bazy
  534. - inteligencja na kaûdym poziomie - np. w rozpoznawaniu wyrazów z literówkâ
  535. */
  536.  
  537. #define DENISE_VERSION "4.2 (00.11)"
  538.  
  539. #ifndef PC_WIN
  540.     // AMIGA/PC_DOS jesli nie wybrano PC_WIN
  541.     #define AMIGA
  542. #endif
  543.  
  544. // czcionki:
  545. // AMIGA - AmigaPL
  546. // PC_WIN - WindowsText
  547. // PC DOS - IBM_Latin2
  548.  
  549. // * MAIN PROGRAM *
  550.  
  551. // include
  552.  
  553. #if defined(AMIGA)
  554.    #include <intuition/intuition.h>
  555.    #include <devices/console.h>
  556.  
  557.    #include <clib/exec_protos.h>
  558.    #include <clib/alib_protos.h>
  559.    #include <clib/dos_protos.h>
  560.    #include <clib/intuition_protos.h>
  561.  
  562.     #include <proto/dos.h>
  563.    #include "include/simplerexx.h"
  564. #else
  565.     #include <dir.h>
  566. #endif
  567.  
  568. #ifdef PC_WIN
  569.    #include <dos.h>
  570. #else
  571.    #include <stdio.h>
  572.    #include <stdlib.h>
  573.    #include <string.h>
  574.    #include <ctype.h>
  575.    #include <errno.h>
  576. #endif
  577.  
  578. #include <time.h>
  579.  
  580. #ifndef PC_WIN
  581.     #include "include/d4_def.h"
  582.     #include "include/d4_str.h"
  583.    #include "include/d4_var.h"
  584.     #include "include/d4_pro.h"
  585. #endif
  586. #include "include/data.cpp"
  587. #include "include/data1.cpp"
  588. #include "include/data2.cpp"
  589. #include "include/data3.cpp"
  590. #include "include/data4.cpp"
  591.  
  592. #include "include/user.cpp"
  593. #include "include/inter.cpp"
  594. #include "include/def_dtr.cpp"
  595. #include "include/eliza1.cpp"
  596. #include "include/eliza2.cpp"
  597.  
  598. #include "include/extra.cpp"
  599. #include "include/grupa.cpp"
  600. #include "include/natural.cpp"
  601. #include "include/fleksja1.cpp"
  602. #include "include/fleksja2.cpp"
  603. #include "include/blisko.cpp"
  604. #include "include/grama1.cpp"
  605. #include "include/grama2.cpp"
  606. #include "include/grama3.cpp"
  607. #include "include/sklad.cpp"
  608.  
  609. #include "include/fakty1.cpp"
  610. #include "include/fakty2.cpp"
  611. #include "include/fakty3.cpp"
  612. #include "include/fakty4.cpp"
  613. #include "include/mapa1.cpp"
  614. #include "include/mapa2.cpp"
  615.  
  616. #include "include/odmiana.cpp"
  617. #include "include/quest1.cpp"
  618. #include "include/quest2.cpp"
  619. #include "include/answer.cpp"
  620. #include "include/myth.cpp"
  621.  
  622. #ifdef AMIGA
  623. void main(void)
  624. {
  625.     main_start();
  626.     amiga_main_loop();
  627. }
  628.  
  629. void FROM amiga_main_loop(void)
  630. {
  631.    /*
  632.    ogólna pëtla prowadzâca (selekcji)
  633.    - pobiera wpisany ciâg i inne komendy,
  634.    - okreôla dokâd majâ byê wyprowadzane dane (okno, ARexx),
  635.    - wysyîa wszystko do myth,
  636.    */
  637.  
  638.    struct IntuiMessage *window_msg;
  639.    struct RexxMsg *rexx_msg;
  640.    ULONG signals,arexx_sig,console_sig,window_sig;
  641.  
  642.    queue_read(&read_buf); /* send the first console read request */
  643.  
  644.    console_sig = 1 << readPort->mp_SigBit;
  645.    window_sig = 1 << window->UserPort->mp_SigBit;
  646.  
  647.    clear_sentence();
  648.    stream.priority=PRIORITY_EMPTY;
  649.    con_put_komunikat(E_DENISE_ROZMOWCA_SIE_NIE_PRZEDSTAWIL);
  650.    stream.priority=PRIORITY_EMPTY;
  651.    con_put(stream.output);
  652.    con_put_dialog(PODMIOT_ROZMOWCA,"",PRIORITY_MAX);
  653.  
  654.    for (;;)
  655.    {
  656.         // body_live(); // podprogram symulujâcy funkcjonowanie organizmu
  657.  
  658.       arexx_sig=ARexxSignal(denise_rexx);
  659.  
  660.       signals=Wait(arexx_sig | console_sig | window_sig);
  661.  
  662.       // jeôli sygnaî z klawiatury (console)
  663.       if (signals & console_sig)
  664.       {
  665.          // czy pobrano linië?
  666.          if (con_get(sentence.orig)==RESULT_OK)
  667.          {
  668.             // wysyîamy pobranâ linië do myth_main()
  669.             stream.mode=STANDARD_MODE;
  670.             stream.priority=PRIORITY_EMPTY;
  671.             myth_main();
  672.             con_put(stream.output);
  673.             if (save.talk==KOD_TRUE) save_talk(stream.output);
  674.             // przygotowanie na nastëpne zdanie
  675.             clear_sentence();
  676.             con_put_dialog(PODMIOT_ROZMOWCA,"",PRIORITY_MAX);
  677.          }
  678.       }
  679.  
  680.       // jeôli sygnaî z okna
  681.       if (signals & window_sig)
  682.       {
  683.          /* We have to ReplyMsg these when done with them */
  684.          while (window_msg = (struct IntuiMessage *)GetMsg(window->UserPort))
  685.          {
  686.             if (window_msg->Class==CLOSEWINDOW)
  687.             {
  688.                ReplyMsg((struct Message *) window_msg);
  689.                con_put("\n");
  690.                safe_exit();
  691.             }
  692.         }
  693.       }
  694.  
  695.       // jeôli sygnaî ARexx'a
  696.       if (signals & arexx_sig)
  697.       {
  698.          while (rexx_msg=GetARexxMsg(denise_rexx))
  699.          {
  700.             // pobieramy wiersz arexx'a
  701.             sprintf(sentence.orig,"%.*s",MAX_LINE_LENGHT-1,ARG0(rexx_msg));
  702.             con_put(UNDERLINE COLOR_03"\nport arexx:"NORMAL_TEXT ITALIC BOLD COLOR_01 " ");
  703.             con_put(sentence.orig);
  704.             con_put(NORMAL_TEXT"\n");
  705.             // wysyîamy pobranâ linië do myth_main()
  706.             stream.mode=AREXX_MODE;
  707.             stream.priority=PRIORITY_EMPTY;
  708.             myth_main();
  709.             con_put(stream.output);
  710.             if (save.talk==KOD_TRUE) save_talk(stream.output);
  711.  
  712.             // wysyîamy odpowiedú do ARexx'a
  713.             ReplyARexxMsg(denise_rexx,rexx_msg,stream.arexx_output,0);
  714.  
  715.             // przygotowanie na nastëpne zdanie
  716.             clear_sentence();
  717.             con_put_dialog(PODMIOT_ROZMOWCA,"",PRIORITY_MAX);
  718.             con_get(sentence.orig); // oznacza to wywoîanie po prostu starej linii
  719.          }
  720.       }
  721.    }
  722. }
  723. #endif
  724.  
  725. void FROM main_start(void)
  726. {
  727. #ifdef AMIGA
  728.    char txt[MAX_LINE_LENGHT];
  729. #endif
  730.  
  731.    clear_variable();
  732.    open_interface();
  733.  
  734.    gnu_start();
  735.  
  736.    config_load();
  737. #ifdef AMIGA
  738.    con_put("\nDenise-MYTH "DENISE_VERSION" Artificial Intelligence");
  739.    if (denise_rexx)
  740.    {
  741.       sprintf(txt," (ARexx: %s)\n",ARexxName(denise_rexx));
  742.       con_put(txt);
  743.    }
  744.    else con_put(" (ARexx nie jest dostëpny\n");
  745. #else
  746.    con_put("\nDenise-MYTH "DENISE_VERSION" Artificial Intelligence");
  747. #endif
  748.  
  749.    con_put("\nsprawdzenie czasu: ");
  750.    con_put(current_time());
  751.    con_put("\n");
  752.    load_data();
  753.    def_denise();
  754.    // dodatkowe informacje jeôli w bazie nie byîo danych o PODMIOCIE DENISE
  755.    if (dtr_defined(PODMIOT_DENISE)==RESULT_NO_OK) con_put("\nuwaga: brak podmiotu DENISE w bazie faktów\n");
  756.  
  757. #ifndef AMIGA
  758.    randomize(); // ûeby liczby losowe byîy bardziej losowe ;)
  759. #endif
  760.    con_put("\n<proszë o przysyîanie WSZYSTKICH plików z katalogu TALK po rozmowie>\n");
  761.    con_put("<'help', 'first run' - pomoc>\n");
  762.  
  763.    if (save.talk==KOD_TRUE) save_talk_new_session();
  764. }
  765.  
  766. void FROM clear_variable(void)
  767. {
  768. #ifdef PC_WIN
  769.     windowline[0].label=Line1;
  770.     windowline[1].label=Line2;
  771.     windowline[2].label=Line3;
  772.     windowline[3].label=Line4;
  773.     windowline[4].label=Line5;
  774.     windowline[5].label=Line6;
  775.     windowline[6].label=Line7;
  776.     windowline[7].label=Line8;
  777.     windowline[8].label=Line9;
  778.     windowline[9].label=Line10;
  779.     windowline[10].label=Line11;
  780.     windowline[11].label=Line12;
  781.     windowline[12].label=Line13;
  782.     windowline[13].label=Line14;
  783.     windowline[14].label=Line15;
  784.     windowline[15].label=Line16;
  785.     windowline[16].label=Line17;
  786.     windowline[17].label=Line18;
  787.     windowline[18].label=Line19;
  788.     windowline[19].label=Line20;
  789.     windowline[20].label=Line21;
  790.     windowline[21].label=Line22;
  791.     windowline[22].label=Line23;
  792.     windowline[23].label=Line24;
  793.     windowline[24].label=Line25;
  794.     windowline[25].label=Line26;
  795.     windowline[26].label=Line27;
  796.     windowline[27].label=Line28;
  797.     windowline[28].label=Line29;
  798.  
  799.     fakt_head=NULL;
  800.     mapa_head=NULL;
  801.     fleksja_head=NULL;
  802. #endif
  803.  
  804.     denise.fakt=NULL;
  805.     denise.obiekt=NULL;
  806.    denise.rodzaj=RODZAJ_ZENSKI;
  807.  
  808.     rozmowca.fakt=NULL;
  809.     rozmowca.obiekt=NULL;
  810.    rozmowca.rodzaj=FLEKSJA_DOWOLNA;
  811.    sprintf(rozmowca.name,"");
  812.  
  813.     temat.fakt=NULL;
  814.     temat.obiekt=NULL;
  815.    temat.rodzaj=FLEKSJA_DOWOLNA;
  816.  
  817.    sprintf(eliza_memory.ost_zdanie,"");
  818.    sprintf(eliza_memory.przed_ost_zdanie,"");
  819.    eliza_memory.ost_zdanie_typ1=ZDANIE_OZNAJMUJACE;
  820.    eliza_memory.ost_zdanie_typ2=ZDANIE_TWIERDZACE;
  821.    eliza_memory.przed_ost_zdanie_typ1=ZDANIE_OZNAJMUJACE;
  822.    eliza_memory.przed_ost_zdanie_typ2=ZDANIE_TWIERDZACE;
  823.  
  824.    sprintf(denise_last_say,"");
  825. }
  826.  
  827. void FROM safe_exit(void)
  828. {
  829.    save_talk_end_session();
  830. #ifdef PC_WIN
  831.     wyjscieClick(Edit1);
  832. #else
  833.     save_data();
  834.     erase_data();
  835.     con_put("\nwychodzë z programu\n");
  836.    delay(800);
  837. #ifdef AMIGA
  838.    delay(400);
  839.    close_interface();
  840. #endif
  841. #ifndef PC_WIN
  842.     exit(0);
  843. #endif
  844. #endif
  845. }
  846.  
  847. void FROM error_exit(char err[])
  848. {
  849. #ifdef PC_WIN
  850.     wyjscieClick(Edit1);
  851. #else
  852.    printf("wystâpiî bîâd: %s\n",err);
  853.     safe_exit();
  854. #endif
  855. }
  856.  
  857. void FROM delay(ULONG ms)
  858. {
  859.     clock_t old=clock();
  860.  
  861.     for(;;)
  862.     {
  863.         if (clock()>CLK_TCK*ms/1000+old) break;
  864.     }
  865. }
  866.  
  867. int FROM drand(void)
  868. {
  869.    srand(clock());
  870.    return rand();
  871. }
  872.  
  873. #ifdef AMIGA
  874. int FROM min(int a,int b)
  875. {
  876.     return a<b ? a : b;
  877. }
  878.  
  879. int FROM max(int a,int b)
  880. {
  881.     return a<a ? b : a;
  882. }
  883. #endif
  884.  
  885. char * FROM current_time(void)
  886. {
  887.    static char date[21];
  888.    time_t t=time(NULL);
  889.  
  890.     strftime(date,21,"%Y.%m.%d. %H:%M:%S",localtime(&t));
  891.     return date;
  892. }
  893.  
  894. char * FROM create_array(char *txt,UBYTE ile)
  895. {
  896.    UBYTE nr1;
  897.    char *mem=(char *) malloc(ile);
  898.    if (mem==NULL) return NULL;
  899.  
  900.    mem[0]=(char) atoi(strtok(txt,","));
  901.    for (nr1=1;nr1<ile;nr1++)
  902.         mem[nr1]=(char) atoi(strtok(NULL,","));
  903.  
  904.    return mem;
  905. }
  906.  
  907. char * FROM create_string(char *txt,int lenght)
  908. {
  909.    char *mem=(char *) malloc(lenght);
  910.    if (mem==NULL) return NULL;
  911.  
  912.    memcpy(mem,txt,lenght-1);
  913.    mem[lenght-1]='\0';
  914.    return mem;
  915. }
  916.  
  917. ULONG FROM file_lenght(FILE *stream)
  918. {
  919.    ULONG size;
  920.    if (fseek(stream,0,SEEK_END)!=NULL) return 0;
  921.    size=ftell(stream);
  922.     rewind(stream);
  923.    return size;
  924. }
  925.  
  926. char FROM pl_ascii(char znacek)
  927. {
  928. #if defined(AMIGA)
  929.    char pl_table[]=" aâbcêdeëfghijklîmnïoópqrsôtuvwxyzûú";
  930. #elif defined(PC_DOS)
  931.     char pl_table[]=" aâbcêdeëfghijklîmnïoópqrsôtuvwxyzûú";
  932. #elif defined(PC_WIN)
  933.    char pl_table[]=" aâbcêdeêfghijklîmnïoópqrsôtuvwxyzûú";
  934. #endif
  935.  
  936.    return (char) (strcspn(pl_table,&znacek) % strlen(pl_table));
  937. }
  938.  
  939. char *FROM pl_ascii_exist(char znacek)
  940. {
  941. #if defined(AMIGA)
  942.    char pl_table[]=" aâbcêdeëfghijklîmnïoópqrsôtuvwxyzûú";
  943. #elif defined(PC_DOS)
  944.     char pl_table[]=" aâbcêdeëfghijklîmnïoópqrsôtuvwxyzûú";
  945. #elif defined(PC_WIN)
  946.    char pl_table[]=" aâbcêdeêfghijklîmnïoópqrsôtuvwxyzûú";
  947. #endif
  948.  
  949.    return strchr(pl_table,znacek);
  950. }
  951.  
  952. char FROM sort_insert(char *txt1,char *txt2)
  953. {
  954.    /*
  955.    funkcja sprawdza, który wyraz jest alfabetycznie pierwszy (tj. kolejnoôê w sîowniku)
  956.  
  957.    zwraca:
  958.    RESULT_OK - jeôli pierwszy powinien byê txt2
  959.    RESULT_NO_OK - jeôli pierwszy powinien byê txt1
  960.    */
  961.  
  962.    UBYTE nr1;
  963.  
  964.    for (nr1=0;nr1<(char) min(strlen(txt1),strlen(txt2));nr1++)
  965.    {
  966.       if (pl_ascii(txt1[nr1])>pl_ascii(txt2[nr1])) return RESULT_OK;
  967.       if (pl_ascii(txt1[nr1])<pl_ascii(txt2[nr1])) return RESULT_NO_OK;
  968.    }
  969.  
  970.    if (strlen(txt1)>strlen(txt2)) return RESULT_OK;
  971.  
  972.    return RESULT_NO_OK;
  973. }
  974.  
  975. void FROM actual_status(void)
  976. {
  977.    char txt[MAX_LINE_LENGHT*4];
  978.  
  979. #ifdef AMIGA
  980.    if (denise_rexx)
  981.    {
  982.       sprintf(txt,"port ARexx: %s\n",ARexxName(denise_rexx));
  983.       con_put(txt);
  984.    }
  985.    else con_put("port ARexx nie jest dostëpny\n");
  986. #endif
  987.  
  988. #ifdef PC_WIN
  989.    sprintf(txt,"liczba sîów/klonów: %ld/%ld (%.3fkB)\n"
  990.                   "liczba faktów/obiektów/FP: %ld/%ld/%ld (%.3fkB)\n"
  991.                "wspóîczynnik inteligencji: %d%%",
  992.                 fleksja_count(),fleksja_count_klony(),(float) fleksja_memory_use()/1024,
  993.                 fakty_count(),fakty_count_obiekt(NULL),
  994.                 fakty_count_simple(MODE_FP,NULL,NULL),(float) fakty_memory_use()/1024,
  995.                 intelligence);
  996.    ShowMessage(txt);
  997. #else
  998.    sprintf(txt,"liczba sîów/klonów: %ld/%ld (%.3fkB)\n",
  999.                 fleksja_count(),fleksja_count_klony(),(float) fleksja_memory_use()/1024);
  1000.    con_put(txt);
  1001.    sprintf(txt,"liczba faktów/obiektów/FP: %ld/%ld/%ld (%.3fkB)\n",
  1002.                      fakty_count(),fakty_count_obiekt(NULL),
  1003.                 fakty_count_simple(MODE_FP,NULL,NULL),(float) fakty_memory_use()/1024);
  1004.    con_put(txt);
  1005.    sprintf(txt,"liczba orzeczników/podrzëdnych/okreôlanych w mapie korelacji: %ld/%ld/%ld (%.3fkB)\n",
  1006.                 mapa_count_grupy(),mapa_count_podrzedne(),mapa_count_okreslane(),(float) mapa_memory_use()/1024);
  1007.    con_put(txt);
  1008.  
  1009.    sprintf(txt,"liczba pozycji/wejôê/wyjôê: %ld/%ld/%ld (%.3fkB)\n",
  1010.                 eliza_count(),eliza_count_ident(),eliza_count_funkc(),(float) eliza_memory_use()/1024);
  1011.    con_put(txt);
  1012.    sprintf(txt,"inteligencja: %d%%\n",intelligence);
  1013.    con_put(txt);
  1014.  
  1015.    switch (mode)
  1016.    {
  1017.       case MODE_USER: con_put("mode USER\n"); break;
  1018.       case MODE_SUPERVISOR: con_put("mode SUPERVISOR\n"); break;
  1019.    }
  1020.  
  1021.    switch (stream.line)
  1022.    {
  1023.       case SINGLELINE: con_put("tryb SINGLELINE\n"); break;
  1024.       case MULTILINE: con_put("tryb MULTILINE\n"); break;
  1025.    }
  1026.  
  1027.    switch (denise_mode)
  1028.    {
  1029.       case KOD_TRUE: con_put("Denise-MYTH ON\n"); break;
  1030.       case KOD_FALSE: con_put("Denise-MYTH OFF\n"); break;
  1031.    }
  1032.  
  1033.    switch (eliza_mode)
  1034.    {
  1035.       case KOD_TRUE: con_put("Eliza ON\n"); break;
  1036.       case KOD_FALSE: con_put("Eliza OFF\n"); break;
  1037.    }
  1038.  
  1039.    switch (deep_identify)
  1040.    {
  1041.       case KOD_TRUE: con_put("wnioskowanie ON\n"); break;
  1042.       case KOD_FALSE: con_put("wnioskowanie OFF\n"); break;
  1043.    }
  1044.  
  1045.    switch (save.nieznane)
  1046.    {
  1047.       case KOD_TRUE: con_put("save nieznane ON\n"); break;
  1048.       case KOD_FALSE: con_put("save nieznane OFF\n");
  1049.     }
  1050.  
  1051.    switch (save.nielog)
  1052.    {
  1053.       case KOD_TRUE: con_put("save nielog ON\n"); break;
  1054.       case KOD_FALSE: con_put("save nielog OFF\n");
  1055.    }
  1056.  
  1057.    switch (save.talk)
  1058.    {
  1059.       case KOD_TRUE: con_put("save rozmowa ON\n"); break;
  1060.       case KOD_FALSE: con_put("save rozmowa OFF\n");
  1061.    }
  1062.  
  1063.     switch (save.odmiana)
  1064.     {
  1065.         case KOD_TRUE: con_put("save odmiana ON\n"); break;
  1066.         case KOD_FALSE: con_put("save odmiana OFF\n");
  1067.     }
  1068. #endif
  1069. }
  1070.  
  1071. void FROM change_intelligence(void)
  1072. {
  1073. #ifdef PC_WIN
  1074.     ButtonInteligencjaClick(Edit1);
  1075. #else
  1076.    char temp[MAX_LINE_LENGHT],busy[MAX_LINE_LENGHT];
  1077.  
  1078.     if (mode==MODE_USER)
  1079.    {
  1080.       con_put("zmiany inteligencji sâ moûliwe tylko w trybie SUPERVISOR\n");
  1081.       return;
  1082.    }
  1083.  
  1084.     con_put("wartoôê (0-100): ");
  1085.     con_get_line(temp);
  1086.     make_busy(temp,busy);
  1087.     if (strlen(busy)==0)
  1088.    {
  1089.       con_put("operacja przerwana\n");
  1090.       return;
  1091.    }
  1092.  
  1093.    if (!isdigit(busy[0]))
  1094.    {
  1095.       con_put("bîâd: uûyto zîych znaków - nie sâ to cyfry\n");
  1096.       return;
  1097.    }
  1098.  
  1099.    if (atoi(busy)>=0 && atoi(busy)<=100)
  1100.       intelligence=atoi(busy);
  1101.    else
  1102.       con_put("bîâd: podano zîâ wartoôê wspóîczynnika inteligencji\n");
  1103. #endif
  1104. }
  1105.  
  1106. void FROM config_load(void)
  1107. {
  1108.    FILE *file;
  1109.    char result=RESULT_OK;
  1110.  
  1111. #ifdef PC_WIN
  1112.    if ((file=data_open(CONFIG_WINDOW_FILE TYPE_DAT,"r"))!=NULL)
  1113.     {
  1114.        // wczytywanie danych z pliku
  1115.        if (fscanf(file,"%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c\n",
  1116.                            &windowline[0].typ,&windowline[1].typ,&windowline[2].typ,&windowline[3].typ,
  1117.                            &windowline[4].typ,&windowline[5].typ,&windowline[6].typ,&windowline[7].typ,
  1118.                            &windowline[8].typ,&windowline[9].typ,&windowline[10].typ,&windowline[11].typ,
  1119.                            &windowline[12].typ,&windowline[13].typ,&windowline[14].typ,&windowline[15].typ,
  1120.                         &windowline[16].typ,&windowline[17].typ,&windowline[18].typ,&windowline[19].typ,
  1121.                         &windowline[20].typ,&windowline[21].typ,&windowline[22].typ,&windowline[23].typ,
  1122.                         &windowline[24].typ,&windowline[25].typ,&windowline[26].typ,&windowline[27].typ,
  1123.                         &windowline[28].typ)==29)
  1124.                con_put("preferencje okna wyôwieltania poprawnie odczytane\n");
  1125.        else
  1126.         {
  1127.           con_put("nie mogë odczytaê ustawieï okna wyôwietlania - bîëdny plik\n");
  1128.           result=RESULT_NO_OK;
  1129.         }
  1130.     }
  1131.     else
  1132.         result=RESULT_NO_OK;
  1133.  
  1134.     if (result==RESULT_NO_OK)
  1135.     {
  1136.          con_put("przyjmujê ustawienia domyôlne\n");
  1137.          // default config
  1138.          for (char nr=0;nr<28;nr++)
  1139.             windowline[nr].typ=LINE_TALK;
  1140.  
  1141.          result=RESULT_OK;
  1142.      }
  1143.  
  1144.     win_console_redraw();
  1145. #endif
  1146.  
  1147.    if ((file=data_open(CONFIG_FILE TYPE_DAT,"r"))!=NULL)
  1148.     {
  1149.        // wczytywanie danych z pliku
  1150.        if (fscanf(file,"%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c\n",
  1151.                  &intelligence,&fast_mode,&compare_mode,&sentence_filter,&deep_identify,
  1152.                  &mode,&eliza_mode,&denise_mode,&stream.line,
  1153.                   &save.odmiana,&save.nieznane,&save.nielog,&save.talk,
  1154.                    &view.fleksja,&view.grupa,&view.skladnia,&view.fakt,&view.pytanie,
  1155.             &view.odpowiedz,&view.odmiana,&view.wnioskowanie,&view.eliza,&view.info)==23)
  1156.           con_put("preferencje programu poprawnie odczytane\n");
  1157.        else
  1158.        {
  1159.           con_put("nie mogë odczytaê preferencji programu - bîëdny plik\n");
  1160.           result=RESULT_NO_OK;
  1161.        }
  1162.  
  1163.        fclose(file);
  1164.     }
  1165.     else
  1166.         result=RESULT_NO_OK;
  1167.  
  1168.    if (result==RESULT_NO_OK)
  1169.     {
  1170.        con_put("przyjmujë ustawienia domyôlne\n");
  1171.  
  1172.       // default config
  1173.       view.fleksja=KOD_FALSE;
  1174.       view.grupa=KOD_FALSE;
  1175.       view.skladnia=KOD_FALSE;
  1176.       view.fakt=KOD_FALSE;
  1177.       view.pytanie=KOD_FALSE;
  1178.       view.odpowiedz=KOD_FALSE;
  1179.       view.odmiana=KOD_FALSE;
  1180.       view.wnioskowanie=KOD_FALSE;
  1181.       view.eliza=KOD_FALSE;
  1182.       view.info=KOD_FALSE;
  1183.       save.odmiana=KOD_TRUE;
  1184.       save.nieznane=KOD_TRUE;
  1185.       save.nielog=KOD_TRUE;
  1186.       save.talk=KOD_TRUE;
  1187.       fast_mode=KOD_TRUE;
  1188.       compare_mode=KOD_TRUE;
  1189.       deep_identify=KOD_TRUE;
  1190.       sentence_filter=KOD_TRUE;
  1191.       denise_mode=KOD_TRUE;
  1192.       eliza_mode=KOD_TRUE;
  1193.       mode=MODE_USER;
  1194.       stream.line=SINGLELINE;
  1195.       intelligence=100;
  1196.    }
  1197.  
  1198. #ifdef PC_WIN
  1199.    set_menu_items();
  1200.    set_panel_items();
  1201. #endif
  1202. }
  1203.  
  1204. void FROM config_save(void)
  1205. {
  1206.    FILE *file;
  1207.  
  1208. #ifdef PC_WIN
  1209.    if ((file=data_open(CONFIG_WINDOW_FILE TYPE_DAT,"w"))!=NULL)
  1210.     {
  1211.        if (fprintf(file,"%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c\n",
  1212.                            windowline[0].typ,windowline[1].typ,windowline[2].typ,windowline[3].typ,
  1213.                            windowline[4].typ,windowline[5].typ,windowline[6].typ,windowline[7].typ,
  1214.                            windowline[8].typ,windowline[9].typ,windowline[10].typ,windowline[11].typ,
  1215.                            windowline[12].typ,windowline[13].typ,windowline[14].typ,windowline[15].typ,
  1216.                            windowline[16].typ,windowline[17].typ,windowline[18].typ,windowline[19].typ,
  1217.                            windowline[20].typ,windowline[21].typ,windowline[22].typ,windowline[23].typ,
  1218.                            windowline[24].typ,windowline[25].typ,windowline[26].typ,windowline[27].typ,
  1219.                      windowline[28].typ)<0)
  1220.           con_put("bîâd: nie mogë zapisaê ustawieï okna wyôwietlania\n");
  1221.        else
  1222.           con_put("preferencje okna wyswietlania zostaîy zapisane\n");
  1223.  
  1224.        fclose(file);
  1225.     }
  1226. #endif
  1227.  
  1228.    if ((file=data_open(CONFIG_FILE TYPE_DAT,"w"))==NULL) return;
  1229.  
  1230.    if (fprintf(file,"%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c,%c\n",
  1231.               intelligence,fast_mode,compare_mode,sentence_filter,deep_identify,
  1232.               mode,eliza_mode,denise_mode,stream.line,
  1233.               save.odmiana,save.nieznane,save.nielog,save.talk,
  1234.               view.fleksja,view.grupa,view.skladnia,view.fakt,view.pytanie,
  1235.               view.odpowiedz,view.odmiana,view.wnioskowanie,view.eliza,view.info)<0)
  1236.       con_put("bîâd: nie mogë zapisaê danych\n");
  1237.    else
  1238.       con_put("preferencje programu zostaîy zapisane\n");
  1239.  
  1240.    fclose(file);
  1241. }
  1242.  
  1243. void FROM help(void)
  1244. {
  1245.    con_put("\nDenise-MYTH "DENISE_VERSION" Artificial Intelligence ("__DATE__")");
  1246.    con_put("\n\nquit, about - wyjôcie z programu, informacje o programie\n");
  1247.    con_put("gnu pl - informacje poczâtkowe w jëzyku polskim\n");
  1248.    con_put("first run - waûne uwagi na starcie\n");
  1249.    con_put("add/delete word - dodanie/kasowanie sîowa\n");
  1250.    con_put("word info, actual status - informacje o sîowie, bazach\n");
  1251.    con_put("check/repair ascii/dane/eliza - kontrola i naprawa danych\n");
  1252.    con_put("fakty learn - nauka faktów z plików: fakt1.dat, fakt2.dat...\n");
  1253.    con_put("fleksja optimize - optymalizacja bazy fleksji\n");
  1254.    con_put("fleksja load/save - wczytuje/zapisuje bazë fleksji\n");
  1255.    con_put("fast mode on/off, compare mode on/off - tryby rozbioru zdania\n");
  1256.    con_put("sentence filter on/off - filtr wtrâceï\n");
  1257.    con_put("deep identify on/off - wnioskowanie\n");
  1258.    con_put("denise mode on/off - tryb Denise-MYTH\n");
  1259.    con_put("eliza mode on/off - podprogram ELIZA\n");
  1260.    con_put("mode user/supervisor - tryb pracy\n");
  1261.    con_put("stream singleline/multiline - liczba linii wyjôciowych\n");
  1262.    con_put("change intelligence - wspóîczynnik inteligencji\n");
  1263.    con_put("save/load config - zapis/odczyt konfiguracji\n");
  1264.    con_put("save odmiana/nieznane/nielog/rozmowa on/off\n");
  1265.    con_put("view fleksja/grupa/skladnia/fakt/pytanie/odpowiedz on/off\n");
  1266.    con_put("view odmiana/wnioskowanie/eliza/info on/off\n");
  1267. }
  1268.  
  1269. void FROM first_run(void)
  1270. {
  1271.    con_put("\npierwsze uruchomienie programu:\n");
  1272.    con_put("- gdy baza faktów jest niepeîna, to Denise moûe nie wiedzieê kim jest,\n");
  1273.    con_put("  naleûy wtedy wpisaê 'jesteô denise'\n");
  1274.    con_put("- zawsze gdy zaczynasz rozmowë przedstaw sië - tego wymaga kultura,\n");
  1275.    con_put("  oraz Denise do identyfikacji, np. 'jestem szymon'\n");
  1276.    con_put("- program rozróûnia duûe i maîe znaki - proszë uûywaê maîych liter\n\n");
  1277. }
  1278.  
  1279. void FROM about(void)
  1280. {
  1281. #ifdef PC_WIN
  1282.    oprogramieClick(Edit1);
  1283. #else
  1284.    con_put("\nDenise-MYTH "DENISE_VERSION" Artificial Intelligence ("__DATE__" - "__TIME__")");
  1285.    con_put("\n\nSzymon Jessa, Warszawska 20/6, 89-600 Chojnice\n");
  1286.    con_put("email: smoczek@ue.eti.pg.gda.pl\n");
  1287.    con_put("homepage: www.ue.eti.pg.gda.pl/~smoczek\n");
  1288.    con_put("download: www.jok.pl/on-line/informatyka/index.shtml\n");
  1289.    con_put("download: aminet: misc/sci\n\n");
  1290. #endif
  1291. }
  1292.  
  1293. void FROM gnu_start(void)
  1294. {
  1295.     con_put("\n* Copyright (C) 2000 Szymon Jessa\n");
  1296.  
  1297.     con_put("* This program is free software; you can redistribute it and/or modify\n");
  1298.     con_put("* it under the terms of the GNU General Public License as published by\n");
  1299.     con_put("* the Free Software Foundation; either version 2 of the License, or\n");
  1300.     con_put("* (at your option) any later version.\n");
  1301.  
  1302.     con_put("* This program is distributed in the hope that it will be useful,\n");
  1303.     con_put("* but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
  1304.     con_put("* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n");
  1305.     con_put("* GNU General Public License for more details.\n");
  1306.  
  1307.     con_put("* You should have received a copy of the GNU General Public License\n");
  1308.     con_put("* along with this program; if not, write to the Free Software\n");
  1309.     con_put("* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n\n");
  1310. }
  1311.  
  1312. void FROM gnu_start_pl(void)
  1313. {
  1314.  
  1315.     con_put("\n* Copyright (C) 2000 Szymon Jessa\n");
  1316.  
  1317.     con_put("* Niniejszy program jest oprogramowaniem wolnodostëpnym; moûesz go rozprowadzaê\n");
  1318.     con_put("* dalej i/lub modyfikowaê na warunkach Powszechnej Licencji Publicznej GNU,\n");
  1319.     con_put("* wydanej przez Fundacjë Wolnodostëpnego Oprogramowania - wedîug wersji 2-giej tej\n");
  1320.     con_put("* Licencji lub którejô z póúniejszych wersji.\n");
  1321.  
  1322.     con_put("* Niniejszy program rozpowszechniany jest z nadziejâ, iû bëdzie on uûyteczny -\n");
  1323.     con_put("* jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyôlnej gwarancji PRZYDATNOÔCI\n");
  1324.     con_put("* HANDLOWEJ albo PRZYDATNOÔCI DO OKREÔLONYCH ZASTOSOWAÏ. W celu uzyskania\n");
  1325.     con_put("* bliûszych informacji - Powszechna Licencja Publiczna GNU.\n");
  1326.  
  1327.     con_put("* Z pewnoôciâ wraz z niniejszym programem otrzymaîeô teû egzemplarz Powszechnej\n");
  1328.     con_put("* Licencji Publicznej GNU; jeôli nie - napisz do Free Software Foundation, Inc.,\n");
  1329.     con_put("* 675 Mass Ave, Cambridge, MA 02139, USA.\n\n");
  1330. }
  1331.